Nixo Home

[Untitled Post]

字数统计: 576阅读时长: 2 min
2019/08/07 Share

title:为什么Android主线程的looper.loop不会导致循环卡死

Looper与Hnadler其实是通过CS模式由Binder进行通讯的

  • 只有主线程发送给Handler让Looper循环的消息中进行了耗时操作才会导致ANR,而Looper中不会,因为Looper在没有消息时会将线程睡眠。

  • Looper并不是运行在主线程里的,他是运行在binder线程中,在ActivityThread的main()方法中创建好Looper和ActivityThread后通过thread.attach方法传递false创建了一个新的binder线程,在调用Looper.loop开启循环

  • Handler消息机制采用的是C/S架构,而Looper采用了服务端Binder接收系统服务AMS发送来的消息,比如说Binder通过Handler将Message发送给主线程

  • 所以Looper.loop是运行在binder线程的,而不是主线程,就不会导致卡死的问题。

  • Binder线程(具体是指ApplicationThread,Binder的服务端,用于接收系统服务AMS发送来的事件的线程)

ActivityThread 并非线程

  • AndroidThread并非线程,不想HandlerThread,他没有继承Thread类,往往只是运行在主线程让人以为他就是主线程的感觉,其实他只是Zygote fork出来的进程而已。

IPC机制

  • IPC机制是两个进程间通讯的一种方式,进程间是互相访问不到的,所以需要开辟一块内核的缓冲区来进行拷贝读取,进程A拷贝到缓冲区,进程B进行读取,这种通讯方式就是IPC方式。

#Activity生命周期流程(IPC)
线程1的AMS中调用线程2的ATP;(由于同一个进程的线程间资源共享,可以相互直接调用,但需要注意多线程并发问题)线程2通过binder传输到App进程的线程4;线程4通过handler消息机制,将暂停Activity的消息发送给主线程;主线程在looper.loop()中循环遍历消息,当收到暂停Activity的消息时,便将消息分发给ActivityThread.H.handleMessage()方法,再经过方法的调用,最后便会调用到Activity.onPause(),当onPause()处理完后,继续循环loop下去。

作者:Gityuan
链接:https://www.zhihu.com/question/34652589/answer/90344494
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

CATALOG
  1. 1. title:为什么Android主线程的looper.loop不会导致循环卡死
  • Looper与Hnadler其实是通过CS模式由Binder进行通讯的
  • ActivityThread 并非线程
  • IPC机制